home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prtrans2.c < prev    next >
C/C++ Source or Header  |  1995-04-06  |  4KB  |  241 lines

  1. #ifdef __linux__
  2. #include <signal.h>
  3. #include <unistd.h>
  4. #include <asm/io.h>
  5. #endif /* __linux__ */
  6. #include "prtrans.h"
  7.  
  8. unsigned baseaddr, stataddr;
  9.  
  10. #ifdef __linux__
  11. static void cleanup (int i);
  12.  
  13. static void cleanup (int i) {
  14.   outb(0, baseaddr); /* this ensures that the server doesn't remain blocked */
  15.   exit(-1);
  16. }
  17. #endif /* __linux__ */
  18.  
  19. int prinit (void) {
  20. #ifdef __linux__
  21.   if (ioperm (baseaddr, 2, 1))
  22.     return -1;
  23.  
  24.   signal(SIGTERM, cleanup);
  25. #endif /* __linux__ */
  26.   outb(0, baseaddr);
  27.   stataddr = baseaddr + 1;
  28.  
  29.   return 0;
  30. }
  31.  
  32. void prclose (void) {
  33.   outb(0, baseaddr);
  34. }
  35.  
  36. void output (unsigned char byte) {
  37.   send (&byte, 1);
  38. }
  39.  
  40. unsigned input (void) {
  41.   unsigned char byte;
  42.  
  43.   receive (&byte, 1);
  44.   return byte;
  45. }
  46.  
  47. unsigned wait_input (void) {
  48.   register unsigned char data;
  49.  
  50.   outb(0xf0, baseaddr);
  51.   while(0x20 & inb(stataddr))
  52.     usleep (SLEEP_TIME);
  53.  
  54.   outb(0, baseaddr);
  55.  
  56.   while(!(0x20 & inb(stataddr)));
  57.   data = (0xc0 & inb(stataddr)) >> 6;
  58.   outb(8, baseaddr);
  59.  
  60.   while(0x20 & inb(stataddr));
  61.   data |= (0xc0 & inb(stataddr)) >> 4;
  62.   outb(0, baseaddr);
  63.  
  64.   while(!(0x20 & inb(stataddr)));
  65.   data |= (0xc0 & inb(stataddr)) >> 2;
  66.   outb(8, baseaddr);
  67.  
  68.   while(0x20 & inb(stataddr));
  69.   data |= 0xc0 & inb(stataddr);
  70.   outb(0, baseaddr);
  71.  
  72.   while(!(0x20 & inb(stataddr)));
  73.  
  74.   return data ^ 0xaa;
  75. }
  76.  
  77. #if !defined(__i386__) && !defined(__GNU_C__)
  78. void send (unsigned char *buffer, unsigned length) {
  79.   while (length--) {
  80.     outb(*buffer | 8, baseaddr);
  81.     while(0x20 & inb(stataddr));
  82.     outb(*buffer++ << 4, baseaddr);
  83.     while(!(0x20 & inb(stataddr)));
  84.   }
  85. }
  86. #else /* __i386__ && __GNU_C__ */
  87. void send (unsigned char *buffer, unsigned length) {
  88.   asm ("push %%ebp
  89.     movw _baseaddr,%%dx
  90.     movl %1,%%ecx
  91.     movl %0,%%ebp
  92.  
  93. sloop:  movb (%%ebp),%%al
  94.     orb $8,%%al
  95.         outb %%al,%%dx
  96.  
  97.         incw %%dx
  98. wait1:
  99.         inb %%dx,%%al
  100.         testb $32,%%al
  101.         jne wait1
  102.  
  103.         movb %0,%%al
  104.         salb $4,%%al
  105.         decw %%dx
  106.         outb %%al,%%dx
  107.  
  108.         incw %%dx
  109. wait2:
  110.         inb %%dx,%%al
  111.         testb $32,%%al
  112.         je wait2
  113.     decw %%dx
  114.  
  115.     inc %%ebp
  116.     loop sloop
  117.     pop %%ebp"
  118.        : /* no outputs */
  119.        : "g" (buffer), "g" (length)
  120.        : "al", "ecx", "dx");
  121. }
  122. #endif /* __i386__ && __GNU_C__ */
  123.  
  124. #if !defined(__i386__) && !defined(__GNU_C__)
  125. void receive (unsigned char *buffer, unsigned length) {
  126.   register unsigned char data;
  127.  
  128.   while (length--) {
  129.     outb(0xf0, baseaddr);
  130.     while(0x20 & inb(stataddr));
  131.     outb(0, baseaddr);
  132.  
  133.     while(!(0x20 & inb(stataddr)));
  134.     data = (0xc0 & inb(stataddr)) >> 6;
  135.     outb(8, baseaddr);
  136.  
  137.     while(0x20 & inb(stataddr));
  138.     data |= (0xc0 & inb(stataddr)) >> 4;
  139.     outb(0, baseaddr);
  140.  
  141.     while(!(0x20 & inb(stataddr)));
  142.     data |= (0xc0 & inb(stataddr)) >> 2;
  143.     outb(8, baseaddr);
  144.  
  145.     while(0x20 & inb(stataddr));
  146.     data |= 0xc0 & inb(stataddr);
  147.     outb(0, baseaddr);
  148.  
  149.     *buffer++ = data ^ 0xaa;
  150.  
  151.     while(!(0x20 & inb(stataddr)));
  152.   }
  153. }
  154. #else /* __i386__ && __GNU_C__ */
  155. void receive (unsigned char *buffer, unsigned length) {
  156.   asm ("movw _baseaddr,%%dx
  157.     push %%ebp
  158.     movl %1,%%ecx
  159.     movl %0,%%ebp
  160.  
  161. rloop:    movb $0xf0,%%al
  162.     outb %%al,%%dx
  163.     incw %%dx
  164. input0:
  165.     inb %%dx,%%al
  166.     testb $32,%%al
  167.     jne input0
  168.     decw %%dx
  169.  
  170.     xorb %%al,%%al
  171.     outb %%al,%%dx
  172.     incw %%dx
  173.  
  174. input1:
  175.     inb %%dx,%%al
  176.     testb $32,%%al
  177.     je input1
  178.     decw %%dx
  179.     andb $0xc0,%%al
  180.     shrb $6,%%al
  181.     mov %%al,(%%ebp)
  182.  
  183.     movb $8,%%al
  184.     outb %%al,%%dx
  185.     incw %%dx
  186.  
  187. input2:
  188.     inb %%dx,%%al
  189.     testb $32,%%al
  190.     jne input2
  191.     decw %%dx
  192.     andb $0xc0,%%al
  193.     shrb $4,%%al
  194.     orb %%al,(%%ebp)
  195.  
  196.     xorb %%al,%%al
  197.     outb %%al,%%dx
  198.     incw %%dx
  199.  
  200. input3:
  201.     inb %%dx,%%al
  202.     testb $32,%%al
  203.     je input3
  204.     decw %%dx
  205.     andb $0xc0,%%al
  206.     shrb $2,%%al
  207.     orb %%al,(%%ebp)
  208.  
  209.     movb $8,%%al
  210.     outb %%al,%%dx
  211.     incw %%dx
  212.  
  213. input4:
  214.     inb %%dx,%%al
  215.     testb $32,%%al
  216.     jne input4
  217.     decw %%dx
  218.     andb $0xc0,%%al
  219.     orb %%al,(%%ebp)
  220.     xorb $0xaa,(%%ebp)
  221.  
  222.     xorb %%al,%%al
  223.     outb %%al,%%dx
  224.     incw %%dx
  225.  
  226. input5:
  227.     inb %%dx,%%al
  228.     testb $32,%%al
  229.     je input5
  230.  
  231.     decw %%dx
  232.  
  233.     inc %%ebp
  234.     loop rloop
  235.     pop %%ebp"
  236.        : /* no outputs */
  237.        : "g" (buffer), "g" (length)
  238.        : "ax", "cx", "dx");
  239. }
  240. #endif /* __i386__ && __GNU_C__ */
  241.